package com.keqiang.chart.impl.axis.impl.line

import android.graphics.Color
import android.graphics.drawable.Drawable
import androidx.annotation.ColorInt
import androidx.annotation.IntDef
import androidx.annotation.Px
import com.keqiang.chart.impl.axis.AxisEntity
import com.keqiang.chart.impl.axis.XAxis
import com.keqiang.chart.utils.px

/**
 * 折线图数据
 *
 * @param xIndex X轴坐标数据，正常情况下肯定与[XAxis]标签一一对应。如果想偏移，以标签位置0举例，此值可以设置为0.5，
 * 则绘制点X坐标在标签位置0和标签位置1中间的位置。
 *
 * @param value y轴数据
 *
 * @author Created by wanggaowan on 2022/7/25 16:45
 */
open class LineEntity(xIndex: Float = 0f, value: Float = 0f) : AxisEntity(xIndex, value) {
    /**
     * 是否绘制标签
     */
    var drawLabel: Boolean = false

    /**
     * 标签值
     */
    var label:String? = null

    /**
     * 标签字体大小
     */
    @setparam:Px
    var labelTextSize: Float = 24f.px

    /**
     * 标签绘制位置
     */
    @setparam:Gravity
    var labelGravity: Int = Gravity.CENTER

    /**
     * 标签字体颜色
     */
    @setparam:ColorInt
    var labelColor: Int = Color.BLACK

    /**
     * 是否绘制指示器
     */
    var drawIndicator: Boolean = false

    /**
     * 指示器图标
     */
    var indicatorDrawable: Drawable? = null

    /**
     * 指示器大小
     */
    @setparam:Px
    var indicatorSize: Float = 10f.px

    /**
     * 标签离[value]绘制位置的偏移距离
     */
    @setparam:Px
    var labelOffset: Float = 0f

    /**
     * 绘制线条类型
     */
    @setparam:LineStyle
    var lineStyle: Int = LineStyle.SOLID_LINE
}

@IntDef(LineStyle.DOTTED_LINE, LineStyle.SOLID_LINE)
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.SOURCE)
annotation class LineStyle {
    companion object {
        /**
         * 虚线
         */
        const val DOTTED_LINE = 0

        /**
         * 实线
         */
        const val SOLID_LINE = 1
    }
}

@IntDef(Gravity.START, Gravity.CENTER, Gravity.END)
@Target(AnnotationTarget.VALUE_PARAMETER)
@Retention(AnnotationRetention.SOURCE)
annotation class Gravity {
    companion object {
        /**
         * 以value所在坐标位置为起点，从左向右绘制
         */
        const val START = 0

        /**
         * 以value所在坐标位置为中点
         */
        const val CENTER = 1

        /**
         * 以value所在坐标位置为结束点，从右向左绘制
         */
        const val END = 2
    }
}